From: Keir Fraser Date: Fri, 13 Mar 2009 07:43:45 +0000 (+0000) Subject: [SVM] fix segment descriptors to allow migration to Intel VT systems X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~13992^2~73 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks://%22/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22?a=commitdiff_plain;h=23599a7fd9d1856f06832be4852738699991ca47;p=xen.git [SVM] fix segment descriptors to allow migration to Intel VT systems Signed-off-by: Christoph Egger --- diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c index 8b49ae8ff4..bd320fbe1f 100644 --- a/xen/arch/x86/hvm/svm/svm.c +++ b/xen/arch/x86/hvm/svm/svm.c @@ -488,28 +488,40 @@ static void svm_get_segment_register(struct vcpu *v, enum x86_segment seg, { case x86_seg_cs: memcpy(reg, &vmcb->cs, sizeof(*reg)); + reg->attr.fields.g = reg->limit > 0xFFFFF; break; case x86_seg_ds: memcpy(reg, &vmcb->ds, sizeof(*reg)); + if ( reg->attr.fields.type != 0 ) + reg->attr.fields.type |= 0x1; break; case x86_seg_es: memcpy(reg, &vmcb->es, sizeof(*reg)); + if ( reg->attr.fields.type != 0 ) + reg->attr.fields.type |= 0x1; break; case x86_seg_fs: svm_sync_vmcb(v); memcpy(reg, &vmcb->fs, sizeof(*reg)); + if ( reg->attr.fields.type != 0 ) + reg->attr.fields.type |= 0x1; break; case x86_seg_gs: svm_sync_vmcb(v); memcpy(reg, &vmcb->gs, sizeof(*reg)); + if ( reg->attr.fields.type != 0 ) + reg->attr.fields.type |= 0x1; break; case x86_seg_ss: memcpy(reg, &vmcb->ss, sizeof(*reg)); reg->attr.fields.dpl = vmcb->cpl; + if ( reg->attr.fields.type == 0 ) + reg->attr.fields.db = 0; break; case x86_seg_tr: svm_sync_vmcb(v); memcpy(reg, &vmcb->tr, sizeof(*reg)); + reg->attr.fields.type |= 0x2; break; case x86_seg_gdtr: memcpy(reg, &vmcb->gdtr, sizeof(*reg));